package com.bjpowernode.ba03;

import com.bjpowernode.ba02.Student;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MyAspect {
    /**
     * 后置通知定义方法，方法是实现切面功能的。
     * 方法的定义要求：
     * 1.公共方法public
     * 2.方法没有返回值
     * 3.方法名称自定义
     * 4.方法有参数的，推荐是Object，参数名自定义
     */

    /**
     * @AfterReturning：后置通知
     *  属性：1.value 切入点表达式
     *      2.returning 自定义的变量，表示目标方法的返回值的。
     *          自定义变量名必须和通知方法的形参名一样。
     * @param res
     */
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther(..))",returning = "res")
    public void myAfterReturning(Object res){
        System.out.println("后置通知：在目标方法之后执行的，获取的返回值是："+res);
        if (res != null){
            res = "Hello Aspectj";
        }
    }

    /**
     * JoinPoint jp 这个参数必须位于第一个，否则会报错
     * @param jp
     * @param res
     */
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther2(..))",returning = "res")
    public void myAfterReturning2(JoinPoint jp,Object res){
        System.out.println("后置通知：方法的定义"+jp.getSignature());
        System.out.println("后置通知：在目标方法之后执行的，获取的返回值是："+res);
        if (res != null){
            ((Student) res).setName("aaa");
            ((Student) res).setAge(60);
        }
    }

}
